WorkSpacesにCloudWatchAgentを導入してWindowsイベントログを出力してみた
どうもコンサルティング部の後藤です。
今回はWindowsのWorkSpacesで、WindowsイベントログをCloudWatchLogsに出力する事をやってみたので、その作業内容をまとめた記事になります。
CloudWatchAgent導入
WorkSpacesにCloudWatchAgentを導入する方法は2通りあるかと存じます。
- SSMでWorkSpacesを管理してRunCommandを実行する
- AWSのドキュメントよりmsiをダウンロードして手動インストールする
今回はWorkSpacesがインターネットに接続できる環境だったため、後者のやり方を取りました。
まず、AWSドキュメントからamazon-cloudwatch-agent.msiをダウンロードして、そのままインストールします。
インストールが完了すると、以下PATHにCloudWatchAgentのフォルダが作成されているかと思います。
C:\Program Files\Amazon\AmazonCloudWatchAgent
環境変数の設定
WindowsイベントログをCloudWatchAgentからCloudWathcLogsに送信するための権限を設定します。WorkSpacesにはIAMロールを付与することが出来ないため、CloudWatchLogsに送信するための権限のみを持たせたIAMユーザを作成して、そのクレデンシャル情報を使用します。
今回使用するIAMユーザには、AWS管理ポリシーの「CloudWatchAgentAdminPolicy」を付与して作成しています。
IAMユーザのクレデンシャル情報が判明したら、その情報をWorkSpacesに保持させます。今回はWorkSpacesにクレデンシャル情報を保持させるため「システム環境変数」に設定していきます。
システム環境変数は以下から新規に設定可能です。
・「システム」->「システムの詳細設定」->「環境変数」-> システム環境変数の「新規」
環境変数として、以下の3つの変数を設定します。
- AWS_REGION : リージョン名を記入(例 : ap-northeast-1
- AWS_SECRET_ACCESS_KEY : シークレットアクセスキー
- AWS_ACCESS_KEY_ID : アクセスキー
Powershellの実行権限
WorkSpacesのPowershell実行権限は以下の通りになっています。
> Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser Undefined LocalMachine Restricted
このままではCloudWatchAgentのスクリプトを実行できないので、以下のコマンドを実行して権限を与えます。。
> Set-ExecutionPolicy RemoteSigned -Scope Process 実行ポリシー変更しますか?の問いに対して、y で回答。 > Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process RemoteSigned CurrentUser Undefined LocalMachine Restricted
Process部分がRemote Signedに変更されていれば実行権限変更完了です。
CloudWatchAgentのConfig設定
Powershellを管理者権限で実行して、以下を実行します。
> cd "C:\Program Files\Amazon\AmazonCloudWatchAgent\" > .\amazon-cloudwatch-agent-config-wizard.exe
configウィザードで必要な部分を選択していきます。今回は最低限Windowsイベントログを出力するconfig.jsonを作成しました。
{ "logs": { "logs_collected": { "windows_events": { "collect_list": [ { "event_format": "xml", "event_levels": [ "VERBOSE", "INFORMATION", "WARNING", "ERROR", "CRITICAL" ], "event_name": "System", "log_group_name": "System", "log_stream_name": "{hostname}" } ] } } } }
config.json作成後、以下コマンドを実行します。
> .\amazon-cloudwatch-agent-ctl.ps1 -a fetch-config -c file:config.json Successfully fetched the config and saved in C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_config.json.tmp Start configuration validation... 2020/11/09 14:02:19 Reading json config file path: C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_config.json.tmp ... Valid Json input schema. No csm configuration found. Configuration validation first phase succeeded Configuration validation second phase succeeded Configuration validation succeeded
Succeededと表示されれば完了です。
CloudWatchAgent実行とログ確認
CloudWatchAgentを実行するため、以下を実行します。
> .\amazon-cloudwatch-agent-ctl.ps1 -a status { "status": "stopped", "starttime": "", "version": "1.247346.0b249609" } > .\amazon-cloudwatch-agent-ctl.ps1 -a start > .\amazon-cloudwatch-agent-ctl.ps1 -a status { "status": "running", "starttime": "2020-11-09T14:06:28", "version": "1.247346.0b249609" }
CloudWatchAgentが実行出来たら、CloudWatchLogsを確認しにいきます。
CloudWatchLogsに指定したロググループが出来ていると思うので、そちらを確認すると以下画像のようにWindowsイベントログが出力されていることが確認出来ました。
最後に
如何だったでしょうか。WindowsのWorkSpacesからCloudWatchAgent経由でWindowsイベントログから出力することが出来ました。が、しかし見難いですね。。出力するWindowsイベントのレベルは設定出来るため、全てのイベントを出力するのではなく重要なイベントのみ通知して検知する仕組みとして使用出来るかなといった所感です。
この記事が何方かのお役になれば幸いです。